package GUI.ventas;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

public class Compra extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * INFORMACION VENTA
	 */
	private int ncliente;
	private int nvendedor;
	/**
	 * tabla
	 */
	private JTable tabla;
	private JPanel infoCompraTabla;
	private JScrollPane scrollPane;
	private JLabel _labelInfoFacturaVendedor;
	private JPanel _panelParaLabelCompraYTotal;
	/**
	 * CALCULADORA
	 */

	private JPanel calculadorayLista;
	
	private JLabel _labelTotal;
	private JPanel _calculadora;
	private JButton _cero;
	private JButton _uno;
	private JButton _dos;
	private JButton _tres;
	private JButton _cuatro;
	private JButton _cinco;
	private JButton _seis;
	private JButton _siete;
	private JButton _ocho;
	private JButton _nueve;
	private JButton _botonBorrarProducto;
	private JButton botonDetalle;
	private ModeloTabla _tableModel;
	private int filaSeleccionadaConElRaton;
	private int filaSeleccionadaConElRaton2;
	private int totalFinal;
	//FACHADA
	
	FachadaVentas fachada;
	
	//BD
	private Connection BD;

	public Compra(Connection c) {
		
		super();
		/**
		 * 
		 */
		this.BD=c;
		this.totalFinal = 0;
		//TODO
		fachada = new FachadaVentas(); 

		/**
		 * 
		 */
		this.build();
		this.construyeCompra();
		this.construyeCalculadora();
		this.borraUnElemento();
		this.cambioPorCalculadora();
		this.detalleElemento();
		/**
		 * 
		 */
		this.add(this.calculadorayLista);

	}
	
	private void build(){
		this.ncliente = 1;
		this.nvendedor = 3;
		//TODO
		//scrollPane = new JScrollPane(tabla);
		this._tableModel = new ModeloTabla(new String[] { "UNIDADES",
				"PRODUCTO", "PRECIO  " });
		tabla = new JTable(this._tableModel);
		//TODO
		scrollPane = fachada.buildTablaProductos(tabla);
		this.calculadorayLista = new JPanel (new GridLayout (2,0));
	}

	private void construyeCompra() {
		this.infoCompraTabla = new JPanel();
		this._panelParaLabelCompraYTotal = new JPanel();

		/**
		 * 
		 * N� DE CLIENTE Y N� VENDEDOR
		 */

		// Creamos un objeto de tipo Date
		/***
		 * HORA
		 */

		Calendar calendario = new GregorianCalendar();
		int hora, minutos, segundos;
		hora = calendario.get(Calendar.HOUR_OF_DAY);
		minutos = calendario.get(Calendar.MINUTE);
		segundos = calendario.get(Calendar.SECOND);

		/**
		 * fecha
		 */
		Date now = new Date();
		DateFormat df = DateFormat.getDateInstance();
		String s = df.format(now);

		/**
		 * ETIQUETA SUPERIOR QUE CONTIENE EL N�FACTURA, IDVENDEDOR, FECHA Y HORA
		 * 
		 *  CAMBIAR DE COLOR LA ETIQUETA: _labelInfoFacturaVendedor.setForeground(Color.green);
		 *  
		 */
		//TODO
		//_labelInfoFacturaVendedor = new JLabel();
		_labelInfoFacturaVendedor = fachada.buildInformacionClienteVendedor();
		//TODO
		_labelInfoFacturaVendedor.setText("N� Factura: " + this.ncliente
				+ "  " + "ID Vendedor: " + this.nvendedor + " "
				+ "                        Fecha: " + s + "   Hora: " + hora
				+ ":" + minutos + ":" + segundos);
		_labelInfoFacturaVendedor.setFont(new Font("Arial", 1, 14));

		/**
		 * LABEL TOTAL DE LA COMPRA
		 */
		//TODO
//		_labelTotal = new JLabel();
		_labelTotal = fachada.buildTotalCompra();
		//TODO
		this.add(_labelTotal);
		this._labelTotal.setText("TOTAL = " + totalFinal + "     " + "�");

		/**
		 * 
		 */

		/**
		 * panel central
		 * 
		 * 
		 * tabla con sus cosillas
		 */
		this.setLayout(new BorderLayout());
		this.calculadorayLista.add(infoCompraTabla, BorderLayout.NORTH);
		this.infoCompraTabla.setLayout(new BorderLayout());
		this.infoCompraTabla.setBorder(BorderFactory
				.createTitledBorder("COMPRA"));
		this.infoCompraTabla.add(scrollPane, BorderLayout.CENTER);

		
		/**
		 * tabla
		 */
		scrollPane.setViewportView(tabla);

		/**
		 * panel norte
		 * 
		 * cliente y total
		 */

		/**
		 * label cliente vendedor Y TOTAL
		 */
		this._labelInfoFacturaVendedor
				.setHorizontalAlignment(SwingConstants.CENTER);
		this._labelTotal.setForeground(Color.RED);
		this._labelTotal.setHorizontalAlignment(SwingConstants.CENTER);
		/**
		 * panel que contiene labels
		 */
		this.add(_panelParaLabelCompraYTotal, BorderLayout.NORTH);
		this._panelParaLabelCompraYTotal.setLayout(new GridLayout(2, 1, 9, 9));
		/**
		 * 
		 * a�adimos las labels
		 */
		this._panelParaLabelCompraYTotal.add(_labelInfoFacturaVendedor);
		this._panelParaLabelCompraYTotal.add(_labelTotal);

	}

	private void construyeCalculadora() {
		//	TODO
//		_calculadora = new JPanel();
		_calculadora = fachada.buildCalculadora();
		//TODO
		_calculadora.setBorder(new TitledBorder(new EtchedBorder(),
				"CALCULADORA"));
		//_calculadora.setBackground(Color.CYAN);
		
		this.calculadorayLista.add(_calculadora, BorderLayout.SOUTH);
		this._calculadora.setLayout(new GridLayout(4, 4, 0, 0));
		//_calculadora.setSize(30, 30);
		this._calculadora.setFont(new Font("Arial", Font.BOLD, 2));

		/**
		 * creamos los botones de la calculadora
		 */
		this._cero = new JButton("0");
		this._cero.setFont(new Font("Arial", 0, 20));
		this._uno = new JButton("1");
		this._uno.setFont(new Font("Arial", 0, 20));
		this._dos = new JButton("2");
		this._dos.setFont(new Font("Arial", 0, 20));
		this._tres = new JButton("3");
		this._tres.setFont(new Font("Arial", 0, 20));
		this._cuatro = new JButton("4");
		this._cuatro.setFont(new Font("Arial", 0, 20));
		this._cinco = new JButton("5");
		this._cinco.setFont(new Font("Arial", 0, 20));
		this._seis = new JButton("6");
		this._seis.setFont(new Font("Arial", 0, 20));
		this._siete = new JButton("7");
		this._siete.setFont(new Font("Arial", 0, 20));
		this._ocho = new JButton("8");
		this._ocho.setFont(new Font("Arial", 0, 25));
		this._nueve = new JButton("9");
		this._nueve.setFont(new Font("Arial", 0, 20));
		this._botonBorrarProducto = new JButton("\n"+"Borrar Producto");
		this.botonDetalle = new JButton ("Detalle");
		
		// metemos los botones de la calculadora en el panel

		this._calculadora.add(this._uno);
		this._calculadora.add(this._dos);
		this._calculadora.add(this._tres);
		this._calculadora.add(this._cuatro);
		this._calculadora.add(this._cinco);
		this._calculadora.add(this._seis);
		this._calculadora.add(this._siete);
		this._calculadora.add(this._ocho);
		this._calculadora.add(this._nueve);
		this._calculadora.add(this._botonBorrarProducto);
		/**
		 * borrar producto
		 */
		this._botonBorrarProducto.setIcon(new ImageIcon(this.getClass()
				.getResource(".//imagenes//borrarProducto.png")));
		this._calculadora.add(this._cero);
		this._calculadora.add(this.botonDetalle);
	}

	private void actualizaLabelTotalCompra() {
		this._labelTotal.setText("TOTAL = " + totalFinal + "     " + "�");
	}

	public void actualizalabelInfoFacturaVendedor(int cliente) {
		/**
		 * hora
		 */
		Calendar calendario = new GregorianCalendar();
		int hora, minutos, segundos;
		hora = calendario.get(Calendar.HOUR_OF_DAY);
		minutos = calendario.get(Calendar.MINUTE);
		segundos = calendario.get(Calendar.SECOND);
		/**
		 * fecha
		 */
		Date now = new Date();
		DateFormat df = DateFormat.getDateInstance();
		String s = df.format(now);
		/**
		 * 
		 */
		this._labelInfoFacturaVendedor.setText("N� Factura: " + cliente + "  "
				+ "ID Vendedor: " + this.nvendedor + " "
				+ "                        Fecha: " + s + "   Hora: " + hora
				+ ":" + minutos + ":" + segundos);

	}

	public void reiniciaLabelCompra() {
		int aux = totalFinal = 0;
		this._labelTotal.setText("TOTAL = " + aux + "     " + "�");

	}

	/**
	 * Erase the table.
	 */

	public void borrarTabla() {
		this._tableModel.borrarTabla();

	}

	/**
	 * Adds an item to the table.
	 * 
	 * @param item
	 */

	public void anyadirElemento(String id,int unidades, String producto, int precio) {
		this._tableModel.anyadirElemento(id,unidades, producto, precio);
		// JOptionPane.showMessageDialog(null,"Has seleccionado: " +producto);

	}
	
	public String todaLaCompra()
	{
	
		
		String[] s = (String[]) this._tableModel._datos.toArray();
		String aux = "";
		for(int i=0;i<s.length;i++)
			aux = aux +s[i];

		return aux;
	
	}



	/**
	 * TABLA CON MODELO
	 */

	// ***********************************************************************************************
	// TABLA
	// **********************************************************************************************
	class ModeloTabla extends AbstractTableModel implements TableModelListener {

		private int _numColumnas;

		/**
		 * Las filas de la tabla. la longitud de String[] es el num Columnas
		 */
		private ArrayList<String[]> _datos;
		private String[] _tituloColumnas;

		@Override
		public String getColumnName(int column) {
			return this._tituloColumnas[column];
		}

		private static final long serialVersionUID = 1L;

		public ModeloTabla(String[] columnNames) {

			this._numColumnas = columnNames.length;
			this._tituloColumnas = columnNames;
			this._datos = new ArrayList<String[]>();
		}

		@Override
		public int getColumnCount() {
			return this._numColumnas;

		}

		@Override
		public int getRowCount() {
			return this._datos.size();
		}

		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			/*
			 * Buscamos la fila
			 */
			String[] fila = this._datos.get(rowIndex);
			/*
			 * Cogemos la columna
			 */
			return fila[columnIndex];
		}

		@Override
		public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

			/*
			 * Buscamos la fila
			 */
			String[] fila = this._datos.get(rowIndex);
			/*
			 * Cogemos la columna
			 */
			fila[columnIndex] = String.valueOf(aValue);
		}

		public void borrarTabla() {

			/*
			 * Tenemos que borrar todos los elementos
			 */
			this._datos.clear();
			this.fireTableDataChanged();

		}

		public void borraFilaSeleccionada(int row) {
			/**
			 * Pasar de String a int String cadena = "1234"; int numero = 0;
			 * numero = Integer.parseInt(cadena)
			 */

			int aux = 0;
			String[] fila = this._datos.get(row);
			aux = Integer.parseInt(fila[2]);
			this._datos.remove(row);
			totalFinal = totalFinal - aux;
			this.fireTableDataChanged();
			_labelTotal.setText("TOTAL = " + (totalFinal) + "     " + "�");
			// System.out.println(totalFinal);

		}

		public void anyadirElemento(String id,int unidades, String producto, int precio) {
			// Tabla bidimensional. Cada item es una fila. De 2 columnas : id y
			// descripcion

			int aux = unidades;
			int aux2 = precio;
			String unidadesString = Integer.toString(aux);
			String precioString = Integer.toString(aux2);
			String[] fila = new String[4];
			fila[0] = unidadesString;
			fila[1] = producto.toString();
			fila[2] = precioString;
			fila[3] = id;
			totalFinal = totalFinal + precio;
			actualizaLabelTotalCompra();
			// JOptionPane.showMessageDialog(null,"TOTALLLLLL: " +sumaTotal());
			this.anyadirFila(fila);

		}
		
		public void guardaFila(String[] fila)
		{
			
		}

		public void modificarTabla(int row, int botonPulsadoDeLaCalculadora) {
			/**
			 * Pasar de String a int String cadena = "1234"; int numero = 0;
			 * numero = Integer.parseInt(cadena)
			 */
			// int unidades = 0;
			int precio = 0;
			String producto;
			String[] fila = this._datos.get(row);
			// string a int
			// unidades = Integer.parseInt(fila[0]);
			// guardamos el nobre del producto
			producto = fila[1];
			// string a int
			precio = Integer.parseInt(fila[2]);
			// operaciones de modificacion:

			totalFinal = totalFinal - precio;
			//System.out.println("TOTAL 1= " + totalFinal);
			// Cambio de unidades por unidades nuevas
			// unidades = botonPulsadoDeLaCalculadora;

			// Nuevo precio total
			precio = botonPulsadoDeLaCalculadora * precio;
			//System.out.println("PRECIO = " + precio);

			// Actualizamos el total
			totalFinal = totalFinal + precio;
			//System.out.println("TOTAL2 = " + totalFinal);
			// Cambiamos a String para pintar en la tabla
			int aux = botonPulsadoDeLaCalculadora;
			int aux2 = precio;
			String unidadesString = Integer.toString(aux);
			String precioString = Integer.toString(aux2);
			String[] filaActualizada = new String[3];
			filaActualizada[0] = unidadesString;
			filaActualizada[1] = producto;
			filaActualizada[2] = precioString;

			// JOptionPane.showMessageDialog(null,"TOTALLLLLL: " +sumaTotal());
			this._datos.remove(row);
			this.anyadirFila(filaActualizada);
			actualizaLabelTotalCompra();
			// _labelTotal.setText("TOTAL = " + (totalFinal) + "     " + "�");

		}

		public void anyadirFila(String[] fila) {
			this._datos.add(fila);
			this.fireTableDataChanged();
		}
		
		public ArrayList<String[]> listaCompra()
		{
			return this._datos;
		}

		@Override
		public void tableChanged(TableModelEvent arg0) {

		}
		
		public String[] conseguirInfo (int fila){
			if (fila > -1){
				String[] infoFila = this._datos.get(fila);
				return infoFila;
			}
			else
				return null;
		}

	}

	public void borraUnElemento() {

		_botonBorrarProducto.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				filaSeleccionadaConElRaton = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton > -1)
					_tableModel.borraFilaSeleccionada(filaSeleccionadaConElRaton);				
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );
			}
		});
	}
	
	public void detalleElemento(){
		botonDetalle.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				filaSeleccionadaConElRaton = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton > -1){
					String [] fila = _tableModel.conseguirInfo(filaSeleccionadaConElRaton);
					InfoArticulo info = new InfoArticulo (fila[1], fila[0], fila [2]);		
				}
					
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );
			}
		});
	}

	public void cambioPorCalculadora() {
		_uno.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				String nombre = _uno.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);

				_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				// JOptionPane.showMessageDialog(null,"quedan: "

			}
		});
		_dos.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _dos.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_tres.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _tres.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_cuatro.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _cuatro.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_cinco.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _cinco.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_seis.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _seis.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_siete.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _siete.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_ocho.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _ocho.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_nueve.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _nueve.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
		_cero.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String nombre = _cero.getText();
				int numeroBotonEnEntero = Integer.parseInt(nombre);
				filaSeleccionadaConElRaton2 = tabla.getSelectedRow();
				if (filaSeleccionadaConElRaton2 > -1)
					_tableModel.modificarTabla(filaSeleccionadaConElRaton2,
						numeroBotonEnEntero);
				else
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila" , "Error", JOptionPane.ERROR_MESSAGE );

			}
		});
	}

	public int getncliente() {
		return this.ncliente;
	}
	
	
	public String getnclienteString() {
		return Integer.toString(this.ncliente);
	}
	
	public int getnVendedor()
	{
		return this.nvendedor;
	}

	public int incrementoFactura() {

		return this.ncliente = this.ncliente + 1;
	}

	public int gettotalFinal()
	{
		return this.totalFinal;
	}

	public ArrayList<String[]> listaCompra() {
		return this._tableModel.listaCompra();
	}
}
























